<?php

/***
 * 描述：购物车模型  
 * 购物车是个数组存放在cookie中：prod_id=>num,spec_qty,stock_prod_id
 * @category		Lib
 * @package			Model			
 * @subpackage	
 * @author			wanght <whtaok@gmail.com>
 * @since			2013-7-30
 * @version			$Id: CartModel.class.php 5 2013-10-14 03:20:14Z whtaok@gmail.com $
 */
class CartModel {
	/**
	 * 描述：添加商品及商品数量到购物车中
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @param 		string 	$shop_id		商铺ID
	 * @param 		string 	$prod_id		商品ID
	 * @param 		string 	$num			数量（$edittype=1：添加数量 $edittype=2：更新数量
	 * @param 		string 	$spec_qty		商品规格数量（单品：1，组合装：>1）
	 * @param 		string 	$stock_prod_id	商品库存ID（组合装：映射到单品ID）
	 * @param 		array	$edittype		$edittype=1：添加数量 $edittype=2：更新数量
	 * @since		2013-4-21
	 */
	public static function addToCart($shop_id,$prod_id,$num,$spec_qty,$stock_prod_id,$edittype=1){	
		$cart = cookie(COK_CART);	//购物车
		$isNewAdd = true;			//是否是新添加商品
		//1.设置商品购买数量
		if($cart){
			//购物车已存在
			$cartItemStr = $cart[$prod_id];
			if($cartItemStr){
				//商品已在购物车中
				$cartItem = split(',', $cartItemStr);
				$cartItemNum = intval($cartItem[0]);
				if($edittype==1){
					$cartItemNum += $num;
				}else{
					$cartItemNum  = $num;
				}
				$isNewAdd = false;
			}
		}
		if($isNewAdd){
			$cartItemNum = $num;	//新加入购物车的商品数量
		}
				
		//2.检查商品库存信息
		if($cartItemNum>0){
			//第一步：获得单品库存
			$dbStockQty = get_prod_stock_qty($shop_id, $stock_prod_id);
			//第二部：检查购物车中是否有其他商品占用该库存，并从总库存中减出去
			foreach ($cart as $key => $value){
				if($key != $prod_id){
					$cartItem = split(',', $value);
					if($cartItem[2]==$stock_prod_id){
						//购物车中的商品库存ID = 当前商品的库存ID
						$dbStockQty -= intval($cartItem[0])*$cartItem[1]; //核算剩余库存
					}
				}
			}
			
			$prodStockQty = intval($dbStockQty/$spec_qty);	//核算商品库存
			if($prodStockQty > 0){
				//有库存的场合：判断是否库存足够
				if($prodStockQty < $cartItemNum ){
					//库存量不足，提示信息
					$rtnData = array(
							'error'=>'0',
							'message'=>'该商品最多可购买【'.$prodStockQty.'】件'
					);
					$cartItemNum = $prodStockQty;
				}else{
					//库存量充足，添加成功
					$rtnData = array(
							'error'=>'0',
							'message'=>''
					);
				}
				$cart[$prod_id] = $cartItemNum.','.$spec_qty.','.$stock_prod_id;
			}else{
				//无库存的场合：提示信息，并从购物车中移除（核算后的值可能<0）
				$rtnData = array(
						'error'=>'0',
						'message'=>'该商品已售完'
				);
				$cartItemNum = 0;
				unset($cart[$prod_id]);
			}
		}else{
			//核算后，商品的购买数量=0；
			$rtnData = array(
					'error'=>'0',
					'message'=>''
			);
			$cartItemNum = 0;
			unset($cart[$prod_id]);	//从购物车中移除商品
		}
		cookie(COK_CART,$cart);		//更新购物车
		$rtnData['cart_num']=count($cart);
		$rtnData['item_num']=$cartItemNum;
		return $rtnData;
	}
	
	/**
	 * 描述：取得购物车中的商品详细信息，不检查库存
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @param 		string 	$shop_id		商铺ID
	 * @since		2013-4-21
	 */	
	public static function getCart($shop_id){
		$cartItems = CartModel::checkCartItems($shop_id);
		$cartPrice = CartModel::checkCartItemsPrice($cartItems);
		$rtnData = array(
				'error'=>'0',
				'message'=>'',
				'cartItems'=>$cartItems,
				'cartPrice'=>$cartPrice
		);
		return $rtnData;
	}
	
	/**
	 * 描述：取得购物车中的商品详细信息，并检查库存（订单提交是调用）
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @param 		string 	$shop_id		商铺ID
	 * @since		2013-4-21
	 */
	public static function checkCart($shop_id){
		$cartItems = CartModel::checkCartItems($shop_id);
		$checkFlag = CartModel::checkCartItemsStock($cartItems);
		$cartPrice = CartModel::checkCartItemsPrice($cartItems);
		if($checkFlag){
			//返回成功信息
			$rtnData = array(
					'error'=>'0',
					'message'=>'',
					'cartItems'=>$cartItems,
					'cartPrice'=>$cartPrice
			);
		}else{
			//刷新购物车
			$cart = array();
			foreach($cartItems as $key => $value){
				$cart[$key] = $value['num'].','.$value['spec_qty'].',';
				if($value['stock_prod_id']==0){
					$cart[$key] .= $key;
				}else{
					$cart[$key] .= $value['stock_prod_id'];
				}
			}
			cookie(COK_CART,$cart);
			//返回错误信息
			$rtnData = array(
					'error'=>'1',
					'message'=>'库存不足',
					'cartItems'=>$cartItems,
					'cartPrice'=>$cartPrice
			);
		}
		return $rtnData;
	}
	
	/**
	 * 描述：检查商铺是否出售购物车中的商品（保证区域切换时，商品在该店铺上架）
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @param 		string 	$shop_id		商铺ID
	 * @since		2013-4-21
	 */
	public static function checkCartItems($shop_id){
		$cart = cookie(COK_CART);
		if($cart){
			$prod_ids = array_keys($cart);
		}
		$mod = new ProductPriceViewModel();
		$list = $mod->findListByProdIds($shop_id,$prod_ids);
		$cartItems = array();
		foreach ($list as $key=>$value){
			$prod_id = $value['prod_id'];	//商品ID
			$itemStr = $cart[$prod_id];		//对应购物车中的商品
			if($itemStr){
				$item = split(',',$itemStr);
				$value['num'] = intval($item[0]);
				$cartItems[$prod_id] = $value;
			}
		}
		return $cartItems;
	}
	
	/**
	 * 描述：核算购物车金额
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @param 		array 	$cartItems		购物车商品详细信息
	 * @since		2013-4-21
	 */
	public static function checkCartItemsPrice($cartItems){
		$cartPrice = array('total_amt'=>0,'total_vip_amt'=>0,'total_num'=>0,'total_item'=>0);
		foreach ($cartItems as $key=>$value){
			//计算单个商品合计
			$cartItems[$key]['item_amt'] = $value['num']*$value['price_real'];
			//$cartItems[$key]['item_sale_amt'] = $value['num']*$value['price_sale'];
			//$cartItems[$key]['item_vip_amt'] = $value['num']*$value['price_vip'];
			//计算所有商品总价
			$cartPrice['total_amt']+=$cartItems[$key]['item_amt'];
			//$cartPrice['total_sale_amt']+=$cartItems[$key]['item_sale_amt'];
			//$cartPrice['total_vip_amt']+=$cartItems[$key]['item_vip_amt'];
			$cartPrice['total_num']+=$value['num'];
			if($value['num']>0){
				$cartPrice['total_item']+=1;
			}
		}
		//配送费用
		if($cartPrice['total_amt']>=C('SHOP_SEND_MIN')){
			$cartPrice['send_fee'] = 0;
		}else{
			$cartPrice['send_fee'] = C('SHOP_SEND_FEE');
		}
		return $cartPrice;
	}	
	
	/**
	 * 描述：检查购物车中商品的库存（库存不足的场合设置库存不足提示信息）
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @param 		array 	&$cartItems		购物车商品详细信息
	 * @since		2013-4-21
	 */
	public static function checkCartItemsStock(&$cartItems){
		$checkFlag = true;//是否存在库存不足的商品
		
		//取得购物车中的商品库存，放到临时数组中
		foreach ($cartItems as $key=>$value){
			if($value['stock_prod_id']==0){
				//单品库存
				$dbStockQty[$key]=intval($value['stock_qty']);
			}else{
				//组合装产品的库存商品ID 是否存在于购物车中
				if($cartItems[$value['stock_prod_id']]){
					//存在的场合：不做操作
				}else{
					//不存在的场合：查询数据库
					$dbStockQty[$value['stock_prod_id']] = get_prod_stock_qty($value['shop_id'], $value['stock_prod_id']);
				}
			}
		}
		$cartCookie = array();
		foreach ($cartItems as $key=>$value){
			$stock_prod_id = $value['stock_prod_id'];
			if($stock_prod_id==0){
				$stock_prod_id = $value['prod_id'];
			}
			if($dbStockQty[$stock_prod_id] <= 0){
				//库存为0
				$cartItems[$key]['num'] = 0;
				$cartItems[$key]['stock_message'] = '商品已售空';
				$checkFlag = false;
			}else{
				//库存不为0
				$total_num = $value['num'] * $value['spec_qty'];//核算成实际购买单品数量
				if($total_num>$dbStockQty[$stock_prod_id]){
					$cartItems[$key]['num'] = intval($dbStockQty[$stock_prod_id]/$value['spec_qty']); //核算成组合装的数量
					$cartItems[$key]['stock_message'] = '该商品最多可购买【'.$cartItems[$key]['num'].'】件';
					$checkFlag = false;
				}
				$dbStockQty[$stock_prod_id] -=$cartItems[$key]['num']*$value['spec_qty']; //库存单品剩余数量
			}
		}
		return $checkFlag;
	}

	/**
	 * 描述：清空购物车
	 * @access		public
	 * @author		wanght<whtaok@gmail.com>
	 * @since		2013-4-21
	 */
	public static function emptyCart(){
		cookie(COK_CART,null);
	}
	
}

?>